home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
NEWSOFT
/
AUGUST
/
WORKDISC
/
!Forthmacs
/
lib
/
debug
< prev
next >
Wrap
Text File
|
1997-04-18
|
6KB
|
184 lines
\ < Copyright 1985-1990 Bradley Forthware
\ Debugger. Thanks, Mike Perry, Henry Laxen, Mark Smeder.
\
\ The debugger lets you single step the execution of a high level
\ definition. To invoke the debugger, type debug xxx where xxx is
\ the name of the word you wish to trace. When xxx executes, you will
\ get a single step trace showing you the word within xxx that
\ is about to execute, and the contents of the parameter stack.
\ Debugging makes everything run slightly slower, even outside
\ the word being debugged. see debug-off
\
\ debug name Mark that word for debugging
\ stepping Debug in single step mode
\ tracing Debug in trace mode
\ debug-off Turn off the debugger (makes the system run fast again)
\ resume Exit from a pushed interpreter (see the f keystroke)
\
\ Keystroke commands while you're single-stepping
\ d go down a level
\ u go up a level
\ c continue trace without single stepping
\ g go turn off stepping and continue execution
\ f push a Forth interpreter, execute "resume" to get back
\ > q abort back to the top level
hex
only forth also definitions system also hidden also
bug also definitions
\needs slow-next ??cr .( Warning- a cpu specific debugger module must be loaded first) abort
needs interact lib/interact.fth
variable slow-next? slow-next? off
variable step? step? on
variable res
: (debug) (s low-adr hi-adr -- )
unbug
1 cnt ! ip> ! <ip ! pnext
slow-next? @ 0=
if here low-dictionary-adr slow-next
slow-next? on
then
step? on ;
: 'unnest (s pfa -- pfa' )
begin dup cell+ swap token@ ['] unnest = until ;
: set-<ip (s pfa -- )
<ip !
<ip @ ip> @ u>=
if <ip @ 'unnest ip> ! then ;
false value first-time?
\ Enter and leave the debugger
forth definitions
: defer? ( acf -- flag ) word-type ['] key word-type = ;
: colon-cf? ( acf -- flag ) word-type ['] defer? word-type = ;
: (debug ( acf -- )
begin dup defer? while behavior repeat
dup colon-cf? 0= abort" Not a colon definition"
>body dup 'unnest (debug)
true is first-time? ;
\ Debug the caller
: debug-me (s -- ) ip@ find-cfa (debug ;
: debug( (s -- ) ip@ dup 'unnest (debug) ;
: )debug (s -- ) ip@ ip> ! ;
: debug-off (s -- ) unbug here low-dictionary-adr fast-next slow-next? off ;
bug also definitions
\ Go up the return stack until we find the return address left by our caller
: caller-ip ( rp -- ip )
begin cell+ dup @ dup in-dictionary?
if ( rs-adr ip )
ip>token token@
dup ['] execute = over defer? or swap <ip @ body> = or
else drop false
then
until ( rs-adr )
@ ip>token ;
: up1 ( rp -- )
caller-ip
dup find-cfa ( ip cfa )
cr ." [ Up to " dup .name ." ]" cr ( ip cfa )
over token@ .name ( ip cfa )
>body swap 'unnest (debug) ;
defer to-debug-window ' noop is to-debug-window
defer restore-window ' noop is restore-window
: .debug-short-help ( -- )
." Stepper keys: <space> Down Up Continue Forth Go Help ? See $tring " [char] " emit ." string Quit" cr ;
: .debug-long-help ( -- )
." Key Action" cr
." <space> Execute displayed word" cr
." D Down: Step down into displayed word" cr
." U Up: Finish current definition and step in its caller" cr
." C Continue: trace current definition without stopping" cr
." F Forth: enter a subordinate Forth interpreter" cr
." G Go: resume normal execution (stop debugging)" cr
." H Help: display this message" cr
." ? Display short list of debug commands" cr
." R RSTrace: Show contents of Forth return stack" cr
." S See: Decompile definition being debugged" cr
." $ Display top of stack as adr,len text string" cr
[char] " emit
." Display top of stack as counted string" cr
." Q Quit: abandon execution of the debugged word" cr ;
d# 24 constant cmd-column
0 value rp-mark
: to-cmd-column ( -- ) cmd-column to-column ;
\ set-package is a hook for Open Firmware. When Open Firmware is loaded,
\ set-package should be set to a word that sets the active package to the
\ package corresponding to the current instance. set-package is called
\ by the "F" key, so the user will see the methods of the current instance.
defer set-package ' noop is set-package
defer unset-package ' noop is unset-package
: try ( n acf -- okay? )
catch ?dup if .error drop false else true then ;
: (trace ( -- )
first-time?
if ??cr ip@ <ip @ =
if ." : " else ." Inside " then
<ip @ find-cfa .name
false is first-time?
rp@ is rp-mark
then
begin step? @ if to-debug-window then
cmd-column 2+ to-column ." ( " .s ." )" cr \ Show stack
['] noop is indent
ip@ .token drop \ Show word name
['] (indent) is indent
to-cmd-column
step? @ key? or
if step? on res off
key dup bl < if drop bl then dup emit upc
restore-window
reset-page
case
[char] D of ip@ token@ dup ['] execute = if drop dup then
['] (debug try endof \ Down
[char] U of rp@ ['] up1 try endof \ Up
[char] C of step? @ 0= step? ! true endof \ Continue
[char] F of cr ." Type 'resume' to return to debugger" cr
set-package interact unset-package false endof \ Forth
[char] G of debug-off cr exit endof \ Go
[char] H of cr .debug-long-help false endof \ Help
[char] R of cr rp0 @ rp@ cell+ (rstrace false endof \ RSTrace
[char] S of cr <ip @ body> (see) false endof \ See
[char] ? of cr .debug-short-help false endof \ Short Help
[char] " of space dup ". cr to-cmd-column false endof \ counted string
[char] $ of space 2dup type cr to-cmd-column false endof \ String
[char] Q of cr ." unbug" abort true endof \ Quit
[char] ( of ip@ set-<ip false endof
[char] < of ip@ cell+ set-<ip 1 cnt ! false endof
[char] ) of ip@ ip> ! 1 cnt ! false endof
[char] * of ip@ find-cfa dup <ip ! 'unnest ip> ! false endof
( default ) true swap
endcase
else true
then
until
ip@ token@ dup ['] unnest = swap ['] exit = or
if cr true is first-time? then
pnext ;
' (trace 'debug token!
only forth bug also forth definitions
: debug \ name (s -- )
'
.debug-short-help
(debug
;
: debugging ( -- ) ' .debug-short-help dup (debug execute ;
: resume (s -- ) true is exit-interact? pnext ;
: stepping (s -- ) step? on ;
: tracing (s -- ) step? off ;
: (bye unbug debug-off (bye ; ' (bye is bye
only forth also definitions decimal